/******************************************************************************* * Copyright (c) 2000, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal; import org.eclipse.jface.dialogs.IPageChangedListener; import org.eclipse.jface.dialogs.PageChangedEvent; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IPartService; import org.eclipse.ui.ISelectionService; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.internal.misc.UIListenerLogging; /** * A part service for a workbench window. */ public class WWinPartService implements IPartService { private PartService partService = new PartService(UIListenerLogging.WINDOW_PARTLISTENER_EVENTS, UIListenerLogging.WINDOW_PARTLISTENER2_EVENTS); private WindowSelectionService selectionService; private IWorkbenchPage activePage; private class WWinListener implements IPartListener2, IPageChangedListener { public void partActivated(IWorkbenchPartReference ref) { updateActivePart(); } public void partBroughtToTop(IWorkbenchPartReference ref) { partService.firePartBroughtToTop(ref); } public void partClosed(IWorkbenchPartReference ref) { partService.firePartClosed(ref); } public void partDeactivated(IWorkbenchPartReference ref) { updateActivePart(); } public void partOpened(IWorkbenchPartReference ref) { partService.firePartOpened(ref); } public void partHidden(IWorkbenchPartReference ref) { partService.firePartHidden(ref); } public void partVisible(IWorkbenchPartReference ref) { partService.firePartVisible(ref); } public void partInputChanged(IWorkbenchPartReference ref) { partService.firePartInputChanged(ref); } public void pageChanged(PageChangedEvent event) { partService.firePageChanged(event); } } private IPartListener2 partListner = new WWinListener(); /** * Creates a new part service for a workbench window. * * @param window * the workbench window */ public WWinPartService(IWorkbenchWindow window) { selectionService = new WindowSelectionService(window); } /* * (non-Javadoc) * Method declared on IPartService */ public void addPartListener(IPartListener l) { partService.addPartListener(l); } /* * (non-Javadoc) * Method declared on IPartService */ public void addPartListener(IPartListener2 l) { partService.addPartListener(l); } /* * (non-Javadoc) * Method declared on IPartService */ public void removePartListener(IPartListener l) { partService.removePartListener(l); } /* * (non-Javadoc) * Method declared on IPartService */ public void removePartListener(IPartListener2 l) { partService.removePartListener(l); } /* * (non-Javadoc) * Method declared on IPartService */ public IWorkbenchPart getActivePart() { return partService.getActivePart(); } private void updateActivePart() { IWorkbenchPartReference activeRef = null; IWorkbenchPart activePart = null; if (activePage != null) { activePart = activePage.getActivePart(); activeRef = activePage.getActivePartReference(); } selectionService.setActivePart(activePart); partService.setActivePart(activeRef); } /* * (non-Javadoc) * Method declared on IPartService */ public IWorkbenchPartReference getActivePartReference() { return partService.getActivePartReference(); } /* * Returns the selection service. */ ISelectionService getSelectionService() { return selectionService; } /* * Notifies that a page has been activated. */ void pageActivated(IWorkbenchPage newPage) { // Optimize. if (newPage == activePage) { return; } // Fire events in the following order: // 1. For each open part in the new page, open it and then (if applicable) make it visible // 2. Deactivate old active part // 3. Activate the new active part // 4. For each open part in the old page, make it invisible then close it // Hook listener on the new page. if (newPage != null) { IWorkbenchPartReference[] refs = ((WorkbenchPage)newPage).getOpenParts(); for (int i = 0; i < refs.length; i++) { IWorkbenchPartReference reference = refs[i]; partService.firePartOpened(reference); IWorkbenchPart part = reference.getPart(false); if (part != null && newPage.isPartVisible(part)) { partService.firePartVisible(reference); } } partService.setActivePart(newPage.getActivePartReference()); selectionService.setActivePart(newPage.getActivePart()); } else { partService.setActivePart(null); selectionService.setActivePart(null); } // Unhook listener from the old page. reset(); // Update active page. activePage = newPage; if (newPage != null) { newPage.addPartListener(partListner); } } /* * Notifies that a page has been closed */ void pageClosed(IWorkbenchPage page) { // Unhook listener from the old page. if (page == activePage) { reset(); } } /* * Notifies that a page has been opened. */ void pageOpened(IWorkbenchPage page) { pageActivated(page); } /* * Resets the part service. The active page, part and selection are * dereferenced. */ private void reset() { IWorkbenchPage tempPage = activePage; activePage = null; if (tempPage != null) { WorkbenchPage page = (WorkbenchPage)tempPage; IWorkbenchPartReference[] refs = page.getOpenParts(); for (int i = 0; i < refs.length; i++) { IWorkbenchPartReference reference = refs[i]; if (page.isPartVisible(reference)) { partService.firePartHidden(reference); } partService.firePartClosed(reference); } tempPage.removePartListener(partListner); } } }